Klasyfikator określający czy grzyb jest trujący na podstawie jego fizjonomii

Hanna Hankus

Inżynieria Danych - Data Science

30/01/2022

1. Wstęp

W ramach projektu, zbudowano klasyfikator określający czy grzyb jest trujący na podstawie jego cech wyglądu zewnętrznego. Podjęto także próbę interpretacji klasyfikatora z wykorzystaniem pakietu DALEX oraz wyjaśnienia predykcji dla wybranej obserwacji.

2. Opis danych

Dane zostały udostępnione w kwietniu 2021r. przez UCI Machine Learning Repository (http://archive.ics.uci.edu/ml/datasets/Secondary+Mushroom+Dataset) i zawierają 61069 hipotetycznych obserwacji grzybów, które zostały zasymulowane losowo na podstawie popularnego zbioru Mushroom Data Set (1987 r.), zawierającego informacje na temat 173 gatunków grzybów. Zbiór danych został utworzony w ramach pracy dyplomowej D. Heidera i G. Hattaba na Uniwersytecie w Marburgu.

Zbiór składa się ze zmiennej celu class determinującej czy grzyb jest trujący oraz 20 zmiennych.

Atrybuty:

  1. cap-diameter (m) - rozmiar kapelusza [cm]
  1. cap-shape (n) - kształt kapelusza

     bell=b, conical=c, convex=x, flat=f, sunken=s, spherical=p, others=o
  2. cap-surface (n) - powierzchnia kapelusza

     fibrous=i, grooves=g, scaly=y, smooth=s, shiny=h, leathery=l, silky=k, sticky=t, wrinkled=w, fleshy=e
  3. cap-color (n) - kolor kapelusza

     brown=n, buff=b, gray=g, green=r, pink=p, purple=u, red=e, white=w, yellow=y, blue=l, orange=o,  black=k
  4. does-bruise-bleed (n) - czy sinieje lub "krawawi"

     bruises-or-bleeding=t,no=f
  5. gill-attachment (n) - rodzaj połączenia blaszek z trzonem

     adnate=a, adnexed=x, decurrent=d, free=e, sinuate=s, pores=p, none=f, unknown=?
  6. gill-spacing (n) - odległość między blaszkami

     close=c, distant=d, none=f
  7. gill-color (n) - kolor blaszek

     see cap-color + none=f
  8. stem-height (m) - wysokość trzonu [cm]

  9. stem-width (m) - szerokość trzonu [mm]

  10. stem-root (n) - kształ grzybni

    bulbous=b, swollen=s, club=c, cup=u, equal=e, rhizomorphs=z, rooted=r
  11. stem-surface (n) - powierzchnia trzonu

    see cap-surface + none=f
  12. stem-color (n) - kolor trzonu

    see cap-color + none=f
  13. veil-type (n) - rodzaj zasnówki

    partial=p, universal=u
  14. veil-color (n) - kolor zasnówki

    see cap-color + none=f
  15. has-ring (n) - czy posiada pierścień

    ring=t, none=f
  16. ring-type (n) - rodzaj pierścienia

    cobwebby=c, evanescent=e, flaring=r, grooved=g, large=l, pendant=p, sheathing=s, zone=z, scaly=y, movable=m, none=f, unknown=?
  17. spore-print-color (n) - kolor wysypu zarodników

    see cap color
  18. habitat (n) - występowanie

    grasses=g, leaves=l, meadows=m, paths=p, heaths=h, urban=u, waste=w, woods=d
  19. season (n) - pora roku występowania

    spring=s, summer=u, autumn=a, winter=w

3. Przygotowanie danych do modelowania

3.1. Import bibliotek i zbioru danych

Na wycinku zbioru danych widać, że pojawia się trochę NA's oraz, że występują 2 typy zmiennych: float i object.

Zmienna celu class oraz pozostałe zmienne jakościowe zostaną zmienione na category.

Przeniesienie zmiennych ciągłych na koniec zbioru danych

Liczebność grup w zmiennej celu:

Podsumownie dla zmiennych ciągłych:

Wśród zmiennych ciągłych występują wartości zerowe, które w przypadku wymiarów nie mają sensu i na etapie czyszczenia danych zostanie to przeanalizowane. Pojawiają się również wartości znacznie wyższe w stosunku do Q3, co może świadczyć o punktach oddalonych, ale to rónież zostanie zweryfikowane w dalszych krokach.

Sprawdzenie liczebności NA w poszczególnych zmiennych

3.2. EDA

3.2.1. Zmienne ciągłe

Zmiana jendostek zmiennej stem-width z [mm] na [cm] i rozbicie zmiennych na osobne zbiory obserwacji dla każdej kategorii zmiennej celu:

Histogram dla każdej zmiennej ciągłej z podziałem na zmienną celu class, graficznie pokaże różnice między rozkładami oraz nienormalizując osi Y można wychwycić potencjalne punkty oddalone.

Powyższe histogramy pokazują, że rozkłady dla trujących grzybów ('p') i jadalnych ('e') nie różnią się bardzo między sobą. W każdym przypadku rozkład jest prawostronnie skośny. Dodatkowo, na histogramach widać jak wiele wartości zerowych jest w zbiorze danych.

Sprawdzenie czy występują punkty oddalone wg założenia, że punkt x jest oddalony, gdy: $$(x < Q_1 - 1.5*IQR) \ \lor \ (x > Q_3 + 1.5*IQR)$$

Jak widać na podsumowniu, niecałe 9% obserwacji zawiera conajmniej 1 punkt oddalony.

Sprawdzenie czy punkty oddalone są skorelowane ze zmienną celu:

Korelacja jest widoczna jedynie w przypadku, gdy dla danej obserwacji występują 3 punkty oddalone, czyli w sytuacji, w której każda wartość zmiennej ciągłej jest outlierem, i takie obserwacje występują jedynie dla grzybów jadalnych ('e'), dlatego utworzona nowa zmienna 'outliers_numb' może się okazać pomocna w klasyfikacji, chciaż dotyczy on niewielkiej części wszystkich obserwacji.

Dla analizowanego zbioru danych, punkty oddalone nie będą usuwane lub zastępowane wartościami średnimi, ponieważ w tym przypadku punkty oddalone pojawiają się tylko jako 'duże' wartości, a krótki research udowodnił, że w przyrodzie występują okazy o podobnych wymiarach.

Sprawdzenie ile wymiarów równych 0 pojawia się dla każdej zmiennej:

Wynika z tego, że wartości równe 0 pojawiają się wyłącznie dla szerokości i wysokości trzonu, do tego jest ich tyle samo dla obu zmiennych. Ponownie, w wyniku researchu okazuje się, że w przyrodzie występują okazy pozbawione widocznego trzonu, więc wartości te nie są bezsensowne.

3.3.2. Zmienne jakościowe

Histogram dla każdej zmiennej kategorycznej z podziałem na zmienną celu class:

Szczególną uwagę zwrócono na zmienne, w których są braki dane. Na wcześniejszych etapach analizy, okazało się, że jest to 9 zmiennych (kolejność od najbardziej wybrakowanych): veil-type, spore-print-color, veil-color, stem-root, stem-surface, gill-spacing, cap-surface, gill-attachment, ring-type.

Wartości brakujące dla zmiennych, które zostały, będą zastąpione wartościami modalnymi.

3.3. Data Cleaning

3.3.1. Label Encoding

Ze względu na dość dużą ilość kategorii w zmiennych jakościowych, zostanie zastosowany label encoding, ponieważ one-hot encoding wygenerowałby bardzo dużą liczbę predyktorów.

3.3.2. Sprawdzenie korealcji pomiędzy zmiennymi

Widoczna jest korelacja pomiędzy zmiennymi cap-diameter i stem-width, co jest uzasadnione w przypadku wymiarów grzyba, ale predyktory narazie zostaną w zbiorze.

3.4. Podział na zbiór uczący i testowy

4. Modelowanie

W ramach pracy zostaną porównane 3 modele opierające się na uczeniu nadzorowanym:

Regresja logistyczna jest jednym z najbardziej optymalnych algorytmów do klasyfikacji binarnej, dlatego stanowi pierwszy wybór. Jest to szczególny przypadek regresji liniowej, w którym funkcję wiążącą jest funkcja logitowa, która przekształca prawdopodobieństwo na logarytm ilorazu szans.

U podstaw metody wektorów nośnych (Support Vector Machines - SVM) leży koncepcja szukania hiperpłaszczyzny, która 'najlepiej' rozdziela klasy zbioru uczącego. Maszyna wektorów nośnych szuka hiperpłaszczyzny maksymalizującej odległość do najbliższego punktu w każdej z klas. Gdy płaszczyzna oddzielająca klasy nie istnieje, dane mogą zostać zmapowane do przestrzeni o większej liczbie wymiarów, co pozwala na separację klas.

Technika lasów losowych polega na otrzymaniu 'mocnego modelu' (ensemblera) poprzez tworzenie wielu drzew decyzyjnych (które są tzw. 'słabymi modelami') i łączenie ich wyników. W przypadku klasyfikacji, wynik jest określany na drodze losowania.

Modele zostaną porównane na podstawie metryk:

$$ Accuracy = \frac{TP + TN}{TP + TN + FP + FN}$$$$ F1 = \frac{2TP}{2TP + FP + FN}$$

gdzie:

$$ TP - klasa \ prawdziwie \ pozytywna$$$$ TN - klasa \ prawdziwie \ negatywna$$$$ FP - klasa \ fałszywie \ pozytywna$$$$ FN - klasa \ fałszywie \ negatywna$$

W pierwszej części, metryki dla modeli zostaną wyznaczone poprzez losowy podział zbioru danych na train=90%, test=10%. W drugiej części, zostaną wyznaczone średnie wartości metryk dla tych samych modeli w wyniku walidacji krzyżowej (k-folds cross-valiadtion), gdzie k=10.

4.1.

4.1.1. Regresja logistyczna

4.1.2. Maszyna wektorów nośnych (SVM)

Czas uczenia powyższego modelu jest znacznie dłuższy niż w przypadku regresji logistycznej jak i lasu losowego. Wynika to z tego, że wymagania obliczeniowe i pamięciowe rosną wraz z liczbą wektorów treningowych (współrzędnych indywidualnej obserwacji). Domyślnie, SVC z pakietu scikit-learn używa nieliniowej funkcji kernela 'rbf', która dodtkowo zwiększa złożoność obliczeniową. Hiperparametr C modelu (współczynnik regularyzacji modelu) jest domyślnie ustawiony jako 1. Zminiejszając go, siła penalizacji za błędną klasyfikację maleje.

Dla porównania, poniżej model liniowego klasyfikatora SVM ze mniejszoną wartością hiperparametru C, który powinien lepiej się skalować do dużych próbek:

4.1.3. Las Losowy (Random Forest)

4.2. Cross-validation

4.2.1. Regresja logistyczna

4.2.2. Maszyna wektorów nośnych (SVM)

4.2.3. Las Losowy (Random Forest)

4.3. Podsumowanie

4.4. Interpretacja modeli

Interpretacja i porównanie 3 modeli z wykorzystaniem pakietu DALEX.

Porównanie wpływu poszczególnych predyktorów w modelach (pierwszy histogram) oraz porównanie klasyfikacji losowej obserwacji ze zbioru dla każdego modelu (drugi histogram):

Dla modelu opartego na regresji logistycznej, 5 najbardziej wpływowych predyktorów na klasyfikację stanowią zmienne (kolejno):

  1. cap-diameter,
  2. stem-height,
  3. stem-surface,
  4. gill-spacing,
  5. veil-color.

Drugi histogram przedstawia w którym miejscu znajduje się cutoff dla klasyfikacji (0.555) oraz jak została podjęta klasyfikacja dla konkretnej zmiennej. Sumarycznie, obserwacja została zaklasyfikowana po 'lewej stronie' separacji, czyli przyjmuje wartość 0, która oznacza 'e' - grzyb jadalny, co jesyt błędną klasyfikacją.

Dla modelu opartego na SVM, 5 najbardziej wpływowych predyktorów na klasyfikację stanowią zmienne (kolejno):

  1. cap-diameter,
  2. stem-height,
  3. gill-spacing,
  4. stem-surface,
  5. cap-shape.

Całkiem podobnie, jak w przypadku regresji logistycznej.

Na drugim histogramie widać jak została podjęta klasyfikacja przykładowej obserwacji jako 1, czyli 'p'.

Dla modelu opartego na random forest, 5 najbardziej wpływowych predyktorów na klasyfikację stanowią zmienne (kolejno):

  1. stem-width,
  2. gill-attachment,
  3. gill-spacing,
  4. stem-color,
  5. stem-surface.

Zmienne istotne dla modelu lasu losowego różnią się w odniesieniu do wcześniejszych modeli.

Na drugim histogramie widać, że przykładowa obserwacja została zaklasyfikowana jako 1, czyli 'p'.

Wnioski

Czas uczenia zbudowanych modeli był stosunkowo długi (a zwłaszcza walidacja krzyżowa), co możnaby usprawnić poprzez redukcję liczby zmiennych na podstawie ich istotności (p-value). Szczególnie w przypadku SVM, czas uczenia, ze względu na duży wymiar zbioru danych, był bardzo nieefektywny.

W przypadku każdego modelu wartości metryk dla zbioru testowego i walidacyjnego nie różniły się znacząco, co może oznaczać, że model nie jest przeuczony. Dodatkowo, wartości metryk zostały zweryfikowane w walidacji krzyżowej 10-foldowej.

Model regresji logistycznej okazał się mieć najniższe metryki. Może to wynikać z współliniowości pomiędzy zmiennymi, z którą regresja logistyczna (jak i liniowa) sobie nie radzi. Na podstawie współczynnika VIF możnaby zweryfikować istniejącą współliniowość i usunąć zmienne o współczynniku VIF > 5. Dodatkowo, interpretacja modelu z wykorzystaniem pakietu DALEX, pokazała, że dla tego modelu wymiary, czyli zmienne ciągłe są predyktorami o największej istotności, dlatego ich współliniowość może znacząco obniżać efektywność klasyfikatora.

Model SVM z kernelem nieliniowym, osiągnął znacznie wyższe wartości metryk, natomiast czas uczenia był znacząco dłuższy. Model okazał się nieefektywny. Dla modelu linearnego SVM, z obniżoną wartością siły regularyzacji (C), uzyskano znacznie korzystniejszy czas uczenia, natomiast kosztem metryk, bo spadły do wartości porównywalnych z modelem regresji logistycznej.

Model lasu losowego okazał się być bardzo szybki pod względem czasu uczenia oraz uzyskał najwyższe wartości metryk (ACC i F1 zbliżone do 1), co jest dla mnie w pewnym stopniu alarmujące, ale jednocześnie nie jestem w stanie znaleźć wady modelu (wykonano walidację krzyżową oraz sam algorytm lasu losowego jest z założenia mniej podatny na przeuczenie), dlatego wybieram go jako najbardziej optymalny.

Realizacja projektu pozwoliła mi znaleźć moje 'słabe' strony w pracy zarówno z samym językiem Python jak i Jupyter Notebook. Gdybym realizowała go ponownie, postarałabym się bardziej zoptymalizować swoją pracę poprzez wykonanie części działań w R, a części w Pythonie - m.in. wykonałabym przynajmniej Eksploracyjną Analizę Danych w R, ponieważ pakiet ggplot2 jest mi bardziej znany i w moim subiektywnym odczuciu jest bardziej intuicyjny.